// -----------------------------------------------------------------------------
// M A R I T I M E   R E S E A R C H   I N S T I T U T E   N E T H E R L A N D S
// -----------------------------------------------------------------------------
// Copyright (C) December 16, 2009 MARIN - All rights reserved - http://www.marin.nl
// -----------------------------------------------------------------------------
// Program  :
// Module   :
// File     : Geometry.h
// -----------------------------------------------------------------------------

#ifndef GEOMETRY_H
#define	GEOMETRY_H

#include <mml/Vector.h>
#include <mml/Matrix.h>
#include "defines.h"

// -----------------------------------------------------------------------------
// class Geometry
// -----------------------------------------------------------------------------
/// short description
/** long description */
// -----------------------------------------------------------------------------
class Geometry
{

public:

    Geometry();

    virtual ~Geometry();

    virtual const mml::Vector3d& getPosition() const;

    virtual const mml::Vector3d& getOrientation() const;

    virtual const mml::Matrix3d& getAttitude() const;

    virtual void setPosition(const mml::Vector3d& position);

    virtual void setPositionOrientation(const mml::Vector3d& position, const mml::Vector3d& orientation);

    virtual void setPositionAttitude(const mml::Vector3d& position, const mml::Matrix3d& attitude);

    virtual REAL getAngle() const;

    virtual void setAngle(REAL angle);

    virtual void move(REAL deltaX, REAL deltaY);

protected:

    mml::Vector3d  m_position;      ///< [m]  earth position of ship's origin
    mml::Matrix3d  m_attitude;      ///< [radians] rotation matrix with respect to ship's origin
    mml::Vector3d  m_orientation;   ///< [radians] roll, pitch, yaw with respect to ship's origin

private:

    REAL           m_angle;         ///< [rad] angle with respect to y-axis

    Geometry(const Geometry& a_other);
    Geometry & operator=(const Geometry& a_other);
};

#endif // GEOMETRY_H

